package com.hrm.system.shiro.realm;

import com.hrm.common.Constants.Constant;
import com.hrm.common.shiro.realm.hrmRealm;
import com.hrm.domain.system.Permission;
import com.hrm.domain.system.User;
import com.hrm.domain.system.response.ProfileResult;
import com.hrm.system.service.PermissionService;
import com.hrm.system.service.UserService;
import org.apache.shiro.authc.*;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author: 林海湾Sea
 * @Date :  2021/12/27 19:55
 * @Decription: 自定义的realm的认证
 *              配置用户登录的realm域，继承公共的hrmRealm补充其中的认证方法即可
 */
public class UserRealm extends hrmRealm {

    @Autowired
    private UserService userService;

    @Autowired
    private PermissionService permissionService;

    // 认证方法
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {

        // 1、获取用户的手机号和密码
        UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
        String mobile = token.getUsername();
        String password = new String(token.getPassword());
        // 2、根据手机号查询用户
        User user = userService.findByMobile(mobile);
        // 3、判断用户是否存在，用户密码是否和输入密码一致
        if (user != null && user.getPassword().equals(password))  {
            // 4、构造安全数据并返回（安全数据：用户基本数据、权限信息、profileResult）
            ProfileResult result = null;
            // 如果是员工，则将员工信息保存
            if (Constant.UserLevel.USER.equals(user.getLevel())) {
                result = new ProfileResult(user);
            } else {
                Map map = new HashMap<>();
                // 如果是企业管理员，查询企业管理员可见的
                if (Constant.UserLevel.COADMIN.equals(user.getLevel())) {
                    map.put("enVisible", "1");
                } else if (Constant.UserLevel.SAASADMIN.equals(user.getLevel())) {
                    // 如果是SaaS管理员，只显示企业不显示的
                    map.put("enVisible", "0");
                }
                List<Permission> list = permissionService.findAll(map);
                result = new ProfileResult(user, list);
            }

            // 构造方法：安全数据，密码，realm域名
            SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(result, user.getPassword(), this.getName());
            return info;
        }
        // 返回null，会抛出异常，表示用户名和密码不匹配
        return null;
    }
}
